package com.hsoft.zhxy.app.demo_03_01.controller;

import com.alibaba.fastjson.JSONObject;
import com.hsoft.zhxy.app.demo_03_01.model.query.DemoQuery;
import com.hsoft.zhxy.common.result.ResultBody;
import com.hsoft.zhxy.common.validated.ValidatedGroup;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.log4j.Log4j2;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;

import javax.validation.Valid;
import javax.validation.constraints.AssertFalse;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Null;


@Api(tags = "demo_03_01 参数校验")
@Log4j2
@Validated
@RestController
@RequestMapping(value = "/demo_03_01/demoVilidated/", produces = "application/json;charset=UTF-8")
public class Demo003ValidatedController {


    /**
     * 不带分组，对象数据校验示例
     * @param demoQuery
     * @return
     */
    @ApiOperation(value = "不带分组，对象数据校验示例", notes = "不带分组，对象数据校验示例")
    @GetMapping("noGroupObjectVerification")
    public JSONObject getParamFromConfig(@Valid DemoQuery demoQuery) {

        if(log.isInfoEnabled()) log.info("校验成功");
        return ResultBody.setData("校验成功");
    }


    /**
     * 不带分组，非对象数据校验示例 （注：get请求传递非对象参数校验时，swagger无法使用，原因是当加上参数校验注解时，swagger会默认将参数的格式转换为body，导致参数无法传递）
     * @param param1
     * @param param2
     * @param param3
     * @param param4
     * @return JSONObject
     */
    @ApiOperation(value = "获取配置文件中参数", notes = "获取配置文件中参数")
    @GetMapping("noGroupParamVerification")
    public JSONObject getParamFromConfig(@Valid @NotNull(message = "param1不可空") Long param1,
                                            @Valid @NotBlank(message = "param2不可空") String param2,
                                            @Valid @Null(message = "param3只能为空") String param3,
                                            @Valid @AssertFalse(message = "param4只能为false") Boolean param4) {
        //其他参数校验注解见：
        /*
        @Null	限制只能为null
        @NotNull	限制必须不为null
        @AssertFalse	限制必须为false
        @AssertTrue	限制必须为true
        @DecimalMax(value)	限制必须为一个不大于指定值的数字
        @DecimalMin(value)	限制必须为一个不小于指定值的数字
        @Digits(integer,fraction)	限制必须为一个小数，且整数部分的位数不能超过integer，小数部分的位数不能超过fraction
        @Future	限制必须是一个将来的日期
        @Max(value)	限制必须为一个不大于指定值的数字
        @Min(value)	限制必须为一个不小于指定值的数字
        @Past	限制必须是一个过去的日期
        @Pattern(value)	限制必须符合指定的正则表达式
        @Size(max,min)	限制字符长度必须在min到max之间
        @Past	验证注解的元素值（日期类型）比当前时间早
        @NotEmpty	验证注解的元素值不为null且不为空（字符串长度不为0、集合大小不为0）
        @NotBlank	验证注解的元素值不为空（不为null、去除首位空格后长度为0），不同于@NotEmpty，@NotBlank只应用于字符串且在比较时会去除字符串的空格
        @Email	验证注解的元素值是Email，也可以通过正则表达式和flag指定自定义的email格式
        */
        if(log.isInfoEnabled()) log.info("校验成功");
        return ResultBody.setData("校验成功");
    }

    /**
     * 分组参数校验 add
     * ！！！分组参数校验注解为 @Validated
     * @return JSONObject
     */
    @ApiOperation(value = "分组参数校验 add", notes = "分组参数校验 add")
    @PostMapping("groupParamVerification01")
    public JSONObject groupParamVerification01(@RequestBody @Validated(value = { ValidatedGroup.Add.class}) DemoQuery demoQuery) {
        return ResultBody.setData(demoQuery);
    }

    /**
     * 分组参数校验 add
     * @return JSONObject
     */
    @ApiOperation(value = "分组参数校验 find", notes = "分组参数校验 find")
    @PostMapping("groupParamVerification02")
    public JSONObject groupParamVerification02(@RequestBody @Validated(value = { ValidatedGroup.Find.class}) DemoQuery demoQuery) {
        return ResultBody.setData(demoQuery);
    }

}
